﻿var xmlreader = require('xmlreader');
var fs = require('fs');

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
var CRC= require('./crc16.js');

var DI_List =[];
var DO_List =[];
var AI_List =[];
var AO_List =[];

var xml =  function modbusXml(pathname,id,callback){
	
     //非阻塞读
	fs.readFile(pathname,'utf-8',function(err,result){
		if(null !== err ){  
				console.log(err)  
				return null;  
		}  

	    xmlreader.read(result, function (err, res){
		    if(null !== err ){  
				console.log(err)  
				return null;  
		    }  
		
		    var DataNum = res.modbusRTU.Data.count();
		    var ListArray = res.modbusRTU.Data.array;
		   
		    for( var i = 0;i<DataNum;i++){
			   				  
			   //modbus  0x01
			   if( ListArray[i].attributes().reg.slice(0,2)  == 'DO'  ){
				   
				   var item = {
					   
						index:ListArray[i].attributes().index,
						devname:ListArray[i].attributes().name,
						devId:ListArray[i].attributes().id,
						regtype:'1',
						regaddr:ListArray[i].attributes().add,
						codeNum:ListArray[i].attributes().frame,
						datatype:ListArray[i].attributes().dtype,
						dataK:ListArray[i].attributes().k,
						dataZero:ListArray[i].attributes().zero
							   
				   }
				 
				 
				   DO_List.push(item);
				      
				//modbus  0x02   
			   }else if(ListArray[i].attributes().reg.slice(0,2)  == 'DI'  ){
				   
					 var item = {
					   
						index:ListArray[i].attributes().index,
						devname:ListArray[i].attributes().name,
						devId:ListArray[i].attributes().id,
						regtype:'2',
						regaddr:ListArray[i].attributes().add,
						codeNum:ListArray[i].attributes().frame,
						datatype:ListArray[i].attributes().dtype,
						dataK:ListArray[i].attributes().k,
						dataZero:ListArray[i].attributes().zero
							   
				   }
				   
				   DI_List.push(item);
				   
				//modbus  0x03   
			   }else if(ListArray[i].attributes().reg.slice(0,2)  == 'AO' ){
				   
				   var item = {
					   
						index:ListArray[i].attributes().index,
						devname:ListArray[i].attributes().name,
						devId:ListArray[i].attributes().id,
						regtype:'3',
						regaddr:ListArray[i].attributes().add,
						codeNum:ListArray[i].attributes().frame,
						datatype:ListArray[i].attributes().dtype,
						dataK:ListArray[i].attributes().k,
						dataZero:ListArray[i].attributes().zero
							   
				   }
				   
				   AO_List.push(item);
				   
				 //modbus  0x04  
			   }else if(ListArray[i].attributes().reg.slice(0,2)  == 'AI'  ){
			   
					
					 var info = {
					   
						index:ListArray[i].attributes().index,
						devname:ListArray[i].attributes().name,
						devId:ListArray[i].attributes().id,
						regtype:'4',
						reqNum:reqNum,
						regaddr:ListArray[i].attributes().add,
						codeNum:ListArray[i].attributes().frame,
						datatype:ListArray[i].attributes().dtype,
						dataK:ListArray[i].attributes().k,
						dataZero:ListArray[i].attributes().zero
					   
				   }	
				   
				    var reqNum;
					if((info.datatype == 'Word16') ||
						(info.datatype == 'UWord16')){
					 
						reqNum ='01';
						
					}else if((info.datatype == 'Float') ||
						(info.datatype == 'Int32')  ||
						(info.datatype == 'UInt32') ){
						 
						 reqNum ='02';
						 
					 }
				    var Addr_Hi = (info.regaddr>>8)&0xff;
			        var Addr_Lo =  info.regaddr&0xff;
				    var reqNum_Hi = (reqNum>>8)&0xff; 
				    var reqNum_Lo =  reqNum&0xff; 

					var TCP = [
						info.devId,
						info.regtype,
						Addr_Hi,
						Addr_Lo,
						reqNum_Hi,
						reqNum_Lo,
					];
									
					var crc16 = CRC.create(TCP);
					CRC_Hi = crc16&0xff;
					CRC_Lo = (crc16>>8)&0xff;
					
					var RTU = [
						info.devId,
						info.regtype,
						Addr_Hi,
						Addr_Lo,
						reqNum_Hi,
						reqNum_Lo,
						CRC_Hi,
						CRC_Lo
						
					];

					var item = {
						type:id,
						info : info,
						TCP : TCP,
						RTU : RTU
						
					}
					   
				   AI_List.push(item);				   
			   }  
			   
		   }
		   
		   function compare(property){
			return function(a,b){
				var value1 = a[property];
				var value2 = b[property];
				return value1 - value2;
			}
		   };
		   
		   DO_List.sort(compare('regaddr'));
		   DI_List.sort(compare('regaddr'));
		   AO_List.sort(compare('regaddr'));
		   AI_List.sort(compare('regaddr'));
		   		   	   
		   
		   event.emit('ok'); 
		   
		});
		
	});
		
	event.on('ok', function() { 

		callback({
				   
				   DO:DO_List,
				   DI:DI_List,
				   AO:AO_List,
				   AI:AI_List
							   
			   });
		
	}); 
	
   

};

module.exports = xml;
 









